/**
 * 远程操作模块
 * 负责与Gitee API交互，获取更新信息和下载链接
 */

import versionManager from './version.js'

class RemoteManager {
  constructor() {
    this.giteeOwner = ''
    this.giteeRepo = ''
    this.giteeToken = ''
    this.updateInfoFile = 'moe_web/update-info.json'
    this.wgtPackageName = '__UNI__E11DC15.wgt'
  }

  /**
   * 设置Gitee配置
   */
  setGiteeConfig(owner, repo, token = '') {
    this.giteeOwner = owner
    this.giteeRepo = repo
    this.giteeToken = token
  }

  /**
   * 检查更新（核心入口）
   */
  async checkForUpdate() {
    try {
      console.log('===== 开始检查更新 =====')
      
      // 获取远程版本信息
      const remoteInfo = await this.getRemoteUpdateInfo()
      
      // 获取本地版本
      const currentVersion = versionManager.getCurrentVersion()
      const remoteVersion = remoteInfo.version
      
      console.log('当前版本:', currentVersion)
      console.log('远程版本:', remoteVersion)
      console.log('更新信息:', remoteInfo)
      
      // 比较版本
      const compareResult = versionManager.compareVersions(currentVersion, remoteVersion)
      
      if (compareResult === -1) {
        console.log('发现新版本，需要更新')
        return {
          hasUpdate: true,
          remoteVersion: remoteVersion,
          currentVersion: currentVersion,
          updateInfo: remoteInfo,
          message: remoteInfo.message || '发现新版本'
        }
      } else if (compareResult === 0) {
        console.log('当前已是最新版本')
        return {
          hasUpdate: false,
          remoteVersion: remoteVersion,
          currentVersion: currentVersion,
          message: '当前已是最新版本'
        }
      } else {
        console.log('本地版本比远程版本更新')
        return {
          hasUpdate: false,
          remoteVersion: remoteVersion,
          currentVersion: currentVersion,
          message: '当前已是最新版本'
        }
      }
    } catch (error) {
      console.error('检查更新失败:', error)
      throw error
    }
  }

  /**
   * 获取远程版本信息
   */
  async getRemoteUpdateInfo() {
    try {
      // 检查Gitee配置是否已设置
      if (!this.giteeOwner || !this.giteeRepo) {
        throw new Error('Gitee配置未设置，请先调用 setGiteeConfig 方法')
      }
      
      console.log('正在获取远程版本信息...')
      console.log('仓库信息:', `${this.giteeOwner}/${this.giteeRepo}`)
      console.log('文件路径:', this.updateInfoFile)
      
      // 直接访问Gitee raw文件（设置页面也是这样做的）
      const directUrl = `https://gitee.com/${this.giteeOwner}/${this.giteeRepo}/raw/master/${this.updateInfoFile}`
      console.log('直接文件地址:', directUrl)
      
      const response = await uni.request({
        url: directUrl,
        method: 'GET',
        timeout: 15000
      })

      console.log('API响应状态:', response.statusCode)
      console.log('API响应数据:', response.data)

      if (response.statusCode === 200) {
        // 直接解析JSON数据
        if (typeof response.data === 'string') {
          try {
            const updateInfo = JSON.parse(response.data)
            console.log('解析后的版本信息:', updateInfo)
            return updateInfo
          } catch (parseError) {
            console.error('解析版本信息失败:', parseError)
            throw new Error('版本信息格式错误')
          }
        } else if (typeof response.data === 'object') {
          console.log('解析后的版本信息:', response.data)
          return response.data
        } else {
          console.error('响应数据格式错误:', typeof response.data)
          throw new Error('响应数据格式错误')
        }
      } else {
        console.error(`请求失败，状态码: ${response.statusCode}`)
        if (response.statusCode === 404) {
          throw new Error('版本信息文件不存在，请检查仓库配置')
        } else if (response.statusCode === 403) {
          throw new Error('访问被限制，请稍后重试')
        }
        throw new Error(`获取版本信息失败: ${response.statusCode}`)
      }
    } catch (error) {
      console.error('获取远程版本信息失败:', error)
      
      // 如果是403限制错误，尝试备用方案
      if (error.message && error.message.includes('403')) {
        console.log('尝试备用获取方案...')
        return await this.getRemoteUpdateInfoFallback()
      }
      
      // 如果是CORS错误，提供更友好的错误信息
      if (error.errMsg && error.errMsg.includes('CORS')) {
        throw new Error('网络访问受限，请检查网络连接或稍后重试')
      }
      
      // 如果是404错误，说明文件不存在
      if (error.message && error.message.includes('404')) {
        throw new Error('版本信息文件不存在，请检查仓库配置或文件路径')
      }
      
      throw error
    }
  }

  /**
   * 备用获取方案 - 使用API方式
   */
  async getRemoteUpdateInfoFallback() {
    try {
      console.log('使用备用API方案获取版本信息...')
      
      // 使用Gitee API获取文件内容
      const apiUrl = `https://gitee.com/api/v5/repos/${this.giteeOwner}/${this.giteeRepo}/contents/${this.updateInfoFile}?ref=master`
      console.log('备用API地址:', apiUrl)
      
      const response = await uni.request({
        url: apiUrl,
        method: 'GET',
        header: this.giteeToken ? { 'Authorization': `token ${this.giteeToken}` } : {},
        timeout: 15000
      })

      console.log('备用API响应状态:', response.statusCode)

      if (response.statusCode === 200 && response.data && response.data.content) {
        try {
          const content = response.data.content
          const decodedContent = decodeURIComponent(escape(atob(content.replace(/\n/g, ''))))
          const updateInfo = JSON.parse(decodedContent)
          console.log('备用方案获取成功:', updateInfo)
          return updateInfo
        } catch (parseError) {
          console.error('备用方案解析失败:', parseError)
          throw new Error('版本信息格式错误')
        }
      }
      
      throw new Error(`备用方案获取失败: ${response.statusCode}`)
    } catch (error) {
      console.error('备用方案也失败了:', error)
      throw new Error('所有获取方案都失败，请检查网络连接或稍后重试')
    }
  }

  /**
   * 获取下载URL
   */
  getDownloadUrl() {
    // 使用Gitee的直接文件下载链接
    const downloadUrl = `https://gitee.com/${this.giteeOwner}/${this.giteeRepo}/raw/master/updates/${this.wgtPackageName}`
    console.log('生成的下载URL:', downloadUrl)
    return downloadUrl
  }

  /**
   * 获取备用下载URL
   */
  getFallbackDownloadUrl() {
    // 备用下载链接（如果有的话）
    const fallbackUrl = `https://gitee.com/${this.giteeOwner}/${this.giteeRepo}/attach_files/downloads/${this.wgtPackageName}`
    console.log('生成的备用下载URL:', fallbackUrl)
    return fallbackUrl
  }
}

export default new RemoteManager() 